package org.example.service.imp;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.example.common.BaseContext;
import org.example.common.CustomException;
import org.example.entity.*;
import org.example.mapper.OrderMapper;
import org.example.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService {
   @Autowired
   private ShoppingCartService shoppingCartService;
   @Autowired
   private UserService userService;
   @Autowired
   private AddressBookService addressBookService;
   @Autowired
   private OrderDetailService orderDetailService;
    @Transactional
    public void submit(Orders orders)
   {
       Long userid = BaseContext.getCurrentId();
       LambdaQueryWrapper<ShoppingCart> wrapper =new LambdaQueryWrapper<>();
       wrapper.eq(ShoppingCart::getUserId,userid);
       List <ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper);

       if(shoppingCarts == null || shoppingCarts.size()==0){
           throw  new CustomException("购物车为空，不能下单");
       }
       User user = userService.getById(userid);

       Long addressBookId = orders.getAddressBookId();
       AddressBook addressBook = addressBookService.getById(addressBookId);
       if(addressBook == null ){
           throw  new CustomException("用户地址为空，不能下单");
       }
       long orderId= IdWorker.getId();
       AtomicInteger amount = new AtomicInteger(0);
       List<OrderDetail> orderDetails=  shoppingCarts.stream().map((item) ->{
           OrderDetail orderDetail = new OrderDetail();
           orderDetail.setOrderId(orderId);
           orderDetail.setNumber(item.getNumber());
           orderDetail.setDishFlavor(item.getDishFlavor());
           orderDetail.setSetmealId(item.getSetmealId());
           orderDetail.setName(item.getName());
           orderDetail.setImage(item.getImage());
           orderDetail.setAmount(item.getAmount());
           amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());

           return orderDetail;
       }).collect(Collectors.toList());



       orders.setId(orderId);
       orders.setOrderTime(LocalDateTime.now());
       orders.setCheckoutTime(LocalDateTime.now());
       orders.setStatus(2);
       orders.setAmount(new BigDecimal(amount.get()));
       orders.setUserId(userid);
       orders.setNumber(String.valueOf(orderId));
       orders.setUserName(user.getName());
       orders.setConsignee(addressBook.getConsignee());
       orders.setPhone(addressBook.getPhone());
       orders.setAddress(addressBook.getProvinceName()==null?"":addressBook.getProvinceName()
               + addressBook.getCityName()==null?"":addressBook.getCityName()
               + addressBook.getDistrictName()==null?"":addressBook.getDistrictName()
               + addressBook.getDetail()==null?"":addressBook.getDetail());

       this.save(orders);


       orderDetailService.saveBatch(orderDetails);


       shoppingCartService.remove(wrapper);
   }
}
